import store from '../store';
import {checkLogin} from './login';
import {login} from '../api/public';
import Cache from '../utils/cache';
import util from '@/utils/util'
import {STATE_R_KEY, USER_INFO, EXPIRES_TIME, LOGIN_STATUS} from './../config/cache';
// #ifdef MP
import {base64src} from "../utils/base64src";
import {mpQrcode} from "../api/api";

// #endif

class Routine {

    constructor() {
        this.scopeUserInfo = 'scope.userInfo';
    }

    async getUserCode() {
        let isAuth = await this.isAuth(), code = '';
        if (isAuth)
            code = await this.getCode();
        return code;
    }

    /**
     * 小程序基础库版本号比较
     */
    compareVersion(v1, v2) {
        v1 = v1.split('.')
        v2 = v2.split('.')
        const len = Math.max(v1.length, v2.length)

        while (v1.length < len) {
            v1.push('0')
        }
        while (v2.length < len) {
            v2.push('0')
        }

        for (let i = 0; i < len; i++) {
            const num1 = parseInt(v1[i])
            const num2 = parseInt(v2[i])

            if (num1 > num2) {
                return 1
            } else if (num1 < num2) {
                return -1
            }
        }

        return 0
    }

    /**
     * 获取用户信息
     */
    getUserProfile() {
        let that = this, code = this.getUserCode();
        return new Promise((resolve, reject) => {
            uni.getUserProfile({
                lang: 'zh_CN',
                desc: '用于完善会员资料', // 声明获取用户个人信息后的用途，后续会展示在弹窗中，请谨慎填写
                success(user) {
                    if (code) user.code = code;
                    resolve({userInfo: user, islogin: false});
                },
                fail(res) {
                    reject(res);
                }
            })
        })
    }

    /**
     * 获取用户信息
     */
    authorize() {
        let that = this;
        return new Promise((resolve, reject) => {
            if (checkLogin())
                return resolve({
                    userInfo: Cache.get(USER_INFO, true),
                    islogin: true,
                });
            uni.authorize({
                scope: that.scopeUserInfo,
                success() {
                    resolve({islogin: false});
                },
                fail(res) {
                    reject(res);
                }
            })
        })
    }

    async getCode() {
        let provider = await this.getProvider();
        return new Promise((resolve, reject) => {
            uni.login({
                provider: provider,
                success(res) {
                    if (res.code) Cache.set(STATE_R_KEY, res.code, 10800);
                    return resolve(res.code);
                },
                fail() {
                    return reject(null);
                }
            })
        })
    }

    /**
     * 获取服务供应商
     */
    getProvider() {
        return new Promise((resolve, reject) => {
            uni.getProvider({
                service: 'oauth',
                success(res) {
                    resolve(res.provider);
                },
                fail() {
                    resolve(false);
                }
            });
        });
    }

    /**
     * 是否授权
     */
    isAuth() {
        let that = this;
        return new Promise((resolve, reject) => {
            uni.getSetting({
                success(res) {
                    if (!res.authSetting[that.scopeUserInfo]) {
                        resolve(true)
                    } else {
                        resolve(true);
                    }
                },
                fail() {
                    resolve(false);
                }
            });
        });
    }

    /**
     * 小程序登录
     */
    authUserInfo(data) {
        return new Promise((resolve, reject) => {
            login(data).then(res => {
                if (res.data.type === 'login') {
                    store.commit('LOGIN', {
                        token: res.data.token
                    });
                    store.commit("SETUID", res.data.id);
                }
                return resolve(res);
            }).catch(res => {
                return reject(res);
            })
        })
    }

    // 小程序分销二维码
    getQrcode() {
        let data = {
            scene: 'id=0&sd=' + Cache.get('UID'),
            page: 'pages/index/index'
        }
        mpQrcode(data).then(res => {
            base64src(res.data.code, Date.now(), res => {
                Cache.set('wechatQRcode', res)
            });
        }).catch(err => {
            util.Tips({
                title: err
            });
        });
    }
}

export default new Routine();
